package com.common;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.util.Size;
import android.view.View;

// 游戏区域
public class GameBoard extends View {
    // 回调
    public interface Callback {
        Size onGameBoardMeasure(View gameBoard, int widthMeasureSpec, int heightMeasureSpec);   // 度量尺寸事件的响应方法
    }

    private Bitmap mBitmap;     // 后台缓冲位图
    private Callback mCallback; // 回调
    private Canvas mDrawer;     // 绘图者

    /**
     * 构造方法。
     * @param context   设备环境
     */
    public GameBoard(Context context) {
        super(context);
    }

    /**
     * 构造方法。
     * @param context   设备环境
     * @param attrs     属性集
     */
    public GameBoard(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    /**
     * 构造方法。
     * @param context   设备环境
     * @param attrs     属性集
     * @param defStyle  默认风格
     */
    public GameBoard(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    /**
     * 获取绘图者。
     * @return 绘图者
     */
    public Canvas getDrawer() {
        return mDrawer;
    }

    /**
     * 重绘事件的响应方法。
     * @param drawer    绘图者
     */
    @Override
    protected void onDraw(Canvas drawer) {
        drawer.drawBitmap(mBitmap, 0.0f, 0.0f, null);
    }

    /**
     * 度量尺寸事件的响应方法。
     * @param widthMeasureSpec  父控件指定的宽度值
     * @param heightMeasureSpec 父控件指定的高度值
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        final Size size = mCallback.onGameBoardMeasure(this, widthMeasureSpec, heightMeasureSpec);
        final int width = size.getWidth();
        final int height = size.getHeight();
        if (mBitmap == null) {
            mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
            mDrawer = new Canvas(mBitmap);
        }
        super.setMeasuredDimension(width, height);
    }

    /**
     * 设置回调。
     * @param callback  回调
     */
    public void setCallback(Callback callback) {
        mCallback = callback;
    }
}
